//package cms.export.deal.netty;
//
//import cms.export.biz.convert.EasyExcelLocalDateConverter;
//import cms.export.biz.convert.EasyExcelLocalDateTimeConverter;
//import cms.export.biz.hard.*;
//import cms.export.biz.manager.MinIoImageManager;
//import com.alibaba.excel.EasyExcel;
//import com.alibaba.excel.ExcelWriter;
//import com.alibaba.excel.annotation.ExcelProperty;
//import com.alibaba.excel.annotation.write.style.ColumnWidth;
//import com.alibaba.excel.context.AnalysisContext;
//import com.alibaba.excel.event.AnalysisEventListener;
//import com.alibaba.excel.util.ListUtils;
//import com.alibaba.excel.write.builder.ExcelWriterBuilder;
//import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
//import com.alibaba.excel.write.metadata.WriteSheet;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import lombok.Data;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.DisposableBean;
//import org.springframework.boot.CommandLineRunner;
//import org.springframework.context.ApplicationListener;
//import org.springframework.context.event.ContextClosedEvent;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.math.BigDecimal;
//import java.time.LocalDateTime;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.LinkedBlockingDeque;
//import java.util.concurrent.ThreadPoolExecutor;
//import java.util.concurrent.TimeUnit;
//
//@Component
//public class ExportDealBootTest implements CommandLineRunner, DisposableBean, ApplicationListener<ContextClosedEvent> {
//
//    @Resource
//    private MinIoImageManager minIoImageManager;
//    private static final Logger log = LoggerFactory.getLogger(ExportDealBootTest.class);
//
//    public static ThreadPoolExecutor treeExecutorPool = new ThreadPoolExecutor(21, 50, 15, TimeUnit.SECONDS,
//            new LinkedBlockingDeque<Runnable>(3), new ThreadPoolExecutor.CallerRunsPolicy());
//
//    public void run(String... args) throws Exception {
//        for(int i=0;i<=20;i++)
//        {
//            int finalI = i;
//            treeExecutorPool.execute(()->{
//                testSaveData(finalI);
//                //testReadData(finalI);
//                //testUpload(finalI);
//            });
////            treeExecutorPool.execute(()->{
////                testSaveData(finalI);
////            });
//        }
//
//        treeExecutorPool.execute(()->{
//            int kk=0;
//            while (kk<100)
//            {
//                CpuInfo cpuInfo = HardWareUtil.getCpuInfo();
//                JvmInfo jvmInfo = HardWareUtil.getJvmInfo();
//                SystemDetails systemInfo = HardWareUtil.getSystemInfo();
//                MemoryInfo memoryInfo = HardWareUtil.getMemoryInfo(SizeEnum.GB);
//                List<SysFile> sysFiles = HardWareUtil.getSysFiles();
//                System.out.println(cpuInfo);
//                System.out.println(jvmInfo);
//                System.out.println(systemInfo);
//                System.out.println(memoryInfo);
//                System.out.println(sysFiles);
//                try {
//                    Thread.sleep(1000);
//                } catch (InterruptedException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//
//        });
//    }
//
//    private void testSaveData(int i)
//    {
//        try{
//            String filePath = "/data/test/export/temp/0-"+ i +".xlsx";
//
//            ExcelWriterBuilder builder = EasyExcel.write(filePath);
//            builder.registerConverter(new EasyExcelLocalDateTimeConverter());
//            builder.registerConverter(new EasyExcelLocalDateConverter());
//            builder.head(TestExportDto.class);
//
//            ExcelWriterSheetBuilder sheetBuilder = EasyExcel.writerSheet("sheet1");
//            WriteSheet writeSheet = sheetBuilder.build();
//
//            ExcelWriter excelWriter = builder.build();
//
//            for(int j=0;j<=200;j++)
//            {
//                List<TestExportDto> list = createNewData();
//                excelWriter.write(list, writeSheet);
//            }
//
//            excelWriter.close();
//        }
//        catch (Exception ex)
//        {
//            log.error("",ex);
//        }
//    }
//
//    private void testReadData(int i)
//    {
//        try{
//            String filePath = "d:/test/export/temp/0-"+ i +".xlsx";
//            NoModelDataListenerTest test = new NoModelDataListenerTest(filePath);
//            EasyExcel.read(filePath, test).sheet().doRead();
//        }
//        catch (Exception ex)
//        {
//            log.error("",ex);
//        }
//    }
//
//    private void testUpload(int i)
//    {
//        try{
//            log.info("开始执行《》{}",i);
//            String filePath = "d:/test/export/temp/0-"+ i +".xlsx";
//            String path = "export/temp/0-"+i+".xlsx";
//            minIoImageManager.saveFile("test",filePath,path);
//        }
//        catch (Exception ex)
//        {
//            log.error("",ex);
//        }
//    }
//
//    private List<TestExportDto> createNewData()
//    {
//        List<TestExportDto> list = new ArrayList<>();
//        for(int k=0;k<=2000;k++)
//        {
//            TestExportDto feeDto = new TestExportDto();
//            feeDto.setBillingFee(new BigDecimal(0.99));
//            feeDto.setWaybillNo(String.valueOf(k));
//            feeDto.setMatOrgName("ageg");
//            feeDto.setMatEmpName("aeg");
//            feeDto.setBillingCode("setBillingCode");
//            feeDto.setBillFlagName("ee");
//            feeDto.setBak("aewate");
//            feeDto.setBillingName("agaeg");
//            list.add(feeDto);
//        }
//        return list;
//    }
//
//    @Override
//    public void destroy() throws Exception {
//        treeExecutorPool.shutdownNow();
//    }
//
//    @Override
//    public void onApplicationEvent(ContextClosedEvent event) {
//        treeExecutorPool.shutdownNow();
//    }
//
//    class NoModelDataListenerTest extends AnalysisEventListener<Map<Integer, String>> {
//        private String fileName;
//        /**
//         * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
//         */
//        private static final int BATCH_COUNT = 2000;
//        private List<JSONObject> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
//
//        public NoModelDataListenerTest(String fileName)
//        {
//            this.fileName = fileName;
//        }
//
//
//
//        /**
//         * 这里会一行行的返回头
//         *
//         * @param headMap
//         * @param context
//         */
//        @Override
//        public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
//
//            log.debug("解析到一条头数据:{}", JSON.toJSONString(headMap));
//        }
//
//        @Override
//        public void invoke(Map<Integer, String> data, AnalysisContext context) {
//            log.debug("解析到一条数据:{}", JSON.toJSONString(data));
//            JSONObject jsonObject = new JSONObject();
//            cachedDataList.add(jsonObject);
//            if (cachedDataList.size() >= BATCH_COUNT) {
//                saveData();
//                cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
//            }
//        }
//
//        @Override
//        public void doAfterAllAnalysed(AnalysisContext context) {
//            saveData();
//            log.debug("所有数据解析完成！");
//        }
//
//        /**
//         * 加上存储数据库
//         */
//        private void saveData() {
//            try {
//                //Thread.sleep(1000);
//            }
//            catch (Exception ex)
//            {
//
//            }
//
//            cachedDataList.clear();
//        }
//    }
//
//    @Data
//    class TestExportDto {
//
//        @ExcelProperty(value = "运单号码",order = 0)
//        @ColumnWidth(15)
//        private String waybillNo;
//
//        @ExcelProperty(value = "结算组编号",order = 1)
//        private String settGroupCode;
//
//        @ExcelProperty(value = "结算组名称",order = 2)
//        private String settGroupName;
//
//        @ExcelProperty(value = "计费对象编号",order = 3)
//        private String billingCode;
//
//        @ExcelProperty(value = "计费对象名称",order = 4)
//        private String billingName;
//
//        @ExcelProperty(value = "计费状态",order = 5)
//        private String settFlagName;
//
//        //@ExcelProperty(value = "计费描述",order = 6)
//        private String bak;
//
//        //@ExcelProperty(value = "账单数据源名称",order = 7)
//        private String dataSourceName;
//
//        //@ExcelProperty(value = "揽收重量",order = 8)
//        private BigDecimal scanWeight;
//
//        @ExcelProperty(value = "结算重量",order = 9)
//        private BigDecimal chargeWeight;
//
//        @ExcelProperty(value = "计费金额",order = 10)
//        private BigDecimal billingFee;
//
//        @ExcelProperty(value = "账单状态",order = 11)
//        private String billFlagName;
//
//        @ExcelProperty(value = "账单时间",order = 12)
//        private Date billTime;
//
//        @ExcelProperty(value = "揽收时间",order = 13)
//        @ColumnWidth(15)
//        private LocalDateTime createTime;
//
//        @ExcelProperty(value = "计费目的地",order = 14)
//        private String chargeDestName;
//
//        @ExcelProperty(value = "计费目的省份",order = 15)
//        private String provinceName;
//
//        @ExcelProperty(value = "计费目的城市",order = 16)
//        private String cityName;
//
//        @ExcelProperty(value = "计费目的分拨名称",order = 17)
//        private String centName;
//
//        //@ExcelProperty(value = "计费时间",order = 18)
//        private LocalDateTime settTime;
//
//        @ExcelProperty(value = "物料网点名称" ,order = 19)
//        @ColumnWidth(15)
//        private String matOrgName;
//
//        /**
//         * 物料业务员
//         */
//        @ExcelProperty(value = "物料业务员编号",order = 20)
//        @ColumnWidth(15)
//        private String matEmpCode;
//
//        @ExcelProperty(value = "物料业务员名称",order = 21)
//        @ColumnWidth(15)
//        private String matEmpName;
//
//        @ExcelProperty(value = "物料客户名称",order = 22)
//        @ColumnWidth(15)
//        private String matCusName;
//
//        @ExcelProperty(value = "物料客商家名称",order = 23)
//        @ColumnWidth(15)
//        private String matSellerName;
//
//        /**
//         * 网点编号
//         */
//        @ExcelProperty(value = "部门名称",order = 24)
//        private String deptName;
//
//        @ExcelProperty(value = "揽收员工号",order = 25)
//        @ColumnWidth(15)
//        private String scanCode;
//
//        @ExcelProperty(value = "揽收员姓名",order = 26)
//        @ColumnWidth(15)
//        private String scanName;
//
//        @ExcelProperty(value = "揽收客户名称",order = 27)
//        private String cusName;
//
//        //@ExcelProperty(value = "一站式账单时间",order = 28)
//        private Date ytoBillTime;
//
//        //@ExcelProperty(value = "一站式重量",order = 29)
//        private BigDecimal ytoWeight;
//
//        /**
//         * 差异金额
//         */
//        //@ExcelProperty(value = "差异重量",order = 30)
//        private BigDecimal ytoDiffFee;
//
//        //@ExcelProperty(value = "一站式目的地",order = 31)
//        private String ytoDesName;
//
//        //@ExcelProperty(value = "揽收目的地",order = 32)
//        private String scanDesName;
//    }
//}
